/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package Controlador;
import Configuracion.Propiedades;
import Modelo.FileInterseccion;
import Modelo.Interseccion;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Properties;
import java.util.StringTokenizer;

/**
 *
 * @author javier
 */
public class GestorInterseccion {

    Properties propiedades = new Propiedades().getProperties();

    private static GestorInterseccion instance;
    private Interseccion[][] matriz = new Interseccion[10][10];
    private ArrayList<FileInterseccion> fileIntersecciones = new ArrayList<FileInterseccion>();
    
    private GestorInterseccion() {
        AbrirArchivosIntersecciones();
        CrearIntersecciones();
    }
    
    public static GestorInterseccion getInstance() {
        if (instance==null){
            instance = new GestorInterseccion();
        }
        return instance;
    }
    
    public Interseccion[][] getMatriz() {
        return matriz;
    }
        
    /* Edgard: Abre todos los archivos de intersecciones e
     * inicializa el arreglo de FileInterseccion que relaciona los archivos
     * con las intersecciones
     */
    private void AbrirArchivosIntersecciones(){
        File directorio = new File(propiedades.getProperty("pathIntersecciones"));
        File []archivos ;
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        FileInterseccion fi = null;
        
        if (directorio.isDirectory()){
            archivos = directorio.listFiles();
            int cantidadArchivos = archivos.length;
            for (int i=0; i<cantidadArchivos; i++){
                
                try {
                    //System.out.println(archivos[i].getAbsolutePath());
                    archivo = new File (archivos[i].getAbsolutePath());
                    
                    fi = new FileInterseccion();
                    fr = new FileReader (archivo);
                    br = new BufferedReader(fr);
                    fi.setFileReader(fr);
                    fi.setBufferedReader(br);
                    fi.setPosX(0);
                    fi.setPosY(0);
                    fileIntersecciones.add(i, fi);
                } catch (Exception e) {
                }
            }
        }
    }
        
    /* Edgard: Lee la primera linea de los archivos de intersecciones y llama a la
     * insertaInterseccion para insertarlo en la matriz
    */
    private void CrearIntersecciones(){

        FileReader fr = null;
        BufferedReader br = null;
        
        for(int i = 0;i<fileIntersecciones.size();i++){

            fr = fileIntersecciones.get(i).getFileReader();
            br = fileIntersecciones.get(i).getBufferedReader();
            
            try {

                String linea;

                linea=br.readLine(); //Edgard: Lectura de las posiciones X e Y
                //System.out.println(linea);

                StringTokenizer st = new StringTokenizer (linea);

                int PosX= Integer.parseInt(st.nextToken());
                int PosY= Integer.parseInt(st.nextToken());
                
                /* Registramos la posicion de las intersecciones que se 
                 * relacionan con sus respectivos archivos
                */
                
                fileIntersecciones.get(i).setPosX(PosX);
                fileIntersecciones.get(i).setPosY(PosY);

                //Creamos interseccion
                Interseccion interseccion = new Interseccion(PosX, PosY);
                InsertaInterseccion(interseccion);

             }
             catch(Exception e){
                e.printStackTrace();
             }
        }
    }  
    
    /* Edgard: Actualiza cada interseccion de la matriz de intersecciones */
    public void ActualizarEstadoIntersecciones(){
        FileReader fr = null;
        BufferedReader br = null;
        
        for(int i = 0;i<fileIntersecciones.size();i++){

            fr = fileIntersecciones.get(i).getFileReader();
            br = fileIntersecciones.get(i).getBufferedReader();
            
            try {
                String linea;

                linea=br.readLine(); //Edgard: Lectura de los 4 valores N E S O

                StringTokenizer st = new StringTokenizer (linea);

                int nAutosNorte= Integer.parseInt(st.nextToken());
                int nAutosEste= Integer.parseInt(st.nextToken());
                int nAutosSur= Integer.parseInt(st.nextToken());
                int nAutosOeste= Integer.parseInt(st.nextToken());

                //Actualizamos Interseccion
                
                int posInterX = fileIntersecciones.get(i).getPosX()/100;
                int posInterY = fileIntersecciones.get(i).getPosY()/100;
                
                Interseccion inter = matriz[posInterX][posInterY];
                inter.setnAutosNorte(nAutosNorte);
                inter.setnAutosEste(nAutosEste);
                inter.setnAutosSur(nAutosSur);
                inter.setnAutosOeste(nAutosOeste);
                
                matriz[posInterX][posInterY]=inter;
                
             }
             catch(Exception e){
                e.printStackTrace();
             }
        }
    }
    
    /* Edgard: Inserta una interseccion en la matri de intersecciones */
    private void InsertaInterseccion(Interseccion interseccion){
        int posMatrizX = interseccion.getPosX()/100;
        int posMatrizY = interseccion.getPosY()/100;;
        
        matriz[posMatrizX][posMatrizY] = interseccion;
    }
    
    public void CerrarArchivosIntersecciones(){
        
        FileReader fr = null;
        BufferedReader br = null;
        
        for(int i = 0;i<fileIntersecciones.size();i++){

            fr = fileIntersecciones.get(i).getFileReader();
            br = fileIntersecciones.get(i).getBufferedReader();
            try{                    
                if( fr != null ){   
                   fr.close();  
                }                  
             }catch (Exception e2){ 
                e2.printStackTrace();
             }
        }
        
        
    }
    
    /*public void DesecharPrimeraLineaIntersecciones(){
        File directorio = new File(propiedades.getProperty("pathIntersecciones"));
        File []archivos ;
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        FileInterseccion fi = null;
        
        if (directorio.isDirectory()){
            archivos = directorio.listFiles();
            int cantidadArchivos = archivos.length;
            for (int i=0; i<cantidadArchivos; i++){
                
                try {
                    //System.out.println(archivos[i].getAbsolutePath());
                    archivo = new File (archivos[i].getAbsolutePath());
                    
                    fi = new FileInterseccion();
                    fr = new FileReader (archivo);
                    br = new BufferedReader(fr);
                    fi.setFileReader(fr);
                    fi.setBufferedReader(br);
                    //fi.setPosX(0);
                    //fi.setPosY(0);
                    fileIntersecciones.add(i, fi);
                } catch (Exception e) {
                }
            }
        }
    }*/
    
}
